﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace WindowsGame1
{
    public class GamePlay 
    {
        Texture2D player1, player2, ball;//texturas dos players 1 e 2 e da bola
        Vector2 ballpos = new Vector2(400f, 240f), speedBall;//posiçao inicial e velocidade da bola
        Vector2 posP1 = new Vector2(10f, 200f), posP2 = new Vector2(764f, 200f);//posições dos players 1 e 2, respectivamente
        Rectangle ballRec, p1Rec, p2Rec;//retangulo de teste de colisao da bola, player1 e player 2, respectivamente
        SpriteFont placar, ptDir, ptEsq, customFont;//forntes do placar, player1 e 2, respectivamente. customFont é a fonte customizada
        int _ptDir, _ptEsq;//potução dos player 1 e 2, respectivamente

        public Vector2 SpeedBall { get; set; }//propriedade da velocidade da bola
        //public Vector2 Ballpos { get { return ballpos; } } //propriedade da posiçao inicial da bola

        public GamePlay()
        {
            //intancia as texturas
            player1 = GameManager.self.Content.Load<Texture2D>("player1");
            player2 = GameManager.self.Content.Load<Texture2D>("player1");
            ball = GameManager.self.Content.Load<Texture2D>("ball");

            //instancia as fontes
            placar = GameManager.self.Content.Load<SpriteFont>("SpriteFont1");
            customFont = GameManager.self.Content.Load<SpriteFont>("Texture");
            ptDir = GameManager.self.Content.Load<SpriteFont>("Texture");
            ptEsq = GameManager.self.Content.Load<SpriteFont>("Texture");
            
            //instancia os retangulos
            ballRec = new Rectangle((int)ballpos.X, (int)ballpos.Y, 27, 27);
            p1Rec = new Rectangle((int)posP1.X, (int)posP1.Y, 27, 154);
            p2Rec = new Rectangle((int)posP2.X, (int)posP2.Y, 27, 154);
                
            //sorteio que define para que lado a bola vai sair 
            Random sorteio = new Random();
            int _sorteio = sorteio.Next(2);
            speedBall = SpeedBall;
            switch (_sorteio)
            {
                case 0: ballpos += speedBall;
                    break;
                case 1: ballpos -= speedBall;
                    break;
                default: return;
            }
        }

        public void Update()
        {
            //atualiza a posiçao dos retangulos
            ballRec.X = (int)ballpos.X;
            ballRec.Y = (int)ballpos.Y;
            p1Rec.X = (int)posP1.X;
            p1Rec.Y = (int)posP1.Y;
            p2Rec.X = (int)posP2.X;
            p2Rec.Y = (int)posP2.Y;

            //movimentaçao do player 1
            #region LeftMove 
            //movimentaçao vertical do player         
            if (Keyboard.GetState().IsKeyDown(Keys.S))
                posP1.Y += 5;
            if (Keyboard.GetState().IsKeyDown(Keys.W))
                posP1.Y -= 5;

            //nao deixa o player sair da "arena"
            if (posP1.Y < 0)
                posP1.Y = 0;
            if (posP1.Y + 154 > 480)
                posP1.Y = 480 - 154;
            #endregion 

            //movimentaçao do player 2
            #region RightMove
            //movimentaçao vertical do player
            if (Keyboard.GetState().IsKeyDown(Keys.Up))
                posP2.Y -= 5;
            if (Keyboard.GetState().IsKeyDown(Keys.Down))
                posP2.Y += 5;

            //nao deixa o player sair da "arena"
            if (posP2.Y < 0)
                posP2.Y = 0;
            if (posP2.Y + 154 > 480)
                posP2.Y = 480 - 154;
            #endregion

            //movimentaçao da bola, nao deixando a bola sair da "arena"
            #region BallMove            
            ballpos += SpeedBall;// atualiza a posiçao da bola somando-a com a velocidade
            if (ballpos.Y < 0)
            {
                speedBall.Y = -SpeedBall.Y;
            }
            if (ballpos.Y + 27 > 480)
            {
                speedBall.Y = -SpeedBall.Y;
            }

            if (ballpos.X < 0)
            {
                _ptEsq++;
                ballpos = new Vector2(400f, 240f);
            }
            if (ballpos.X + 27 > 800)
            {
                _ptDir++;
                ballpos = new Vector2(400f, 240f);
            }
            #endregion

            //logica de colisao entre os players e a bola
            #region Collision between ball and players
            if (ballRec.Intersects(p1Rec))//caso haja interseção de pixels entre o player e a bola, sua velocidade é igualada ao seu oposto, para ela voltar em sentido contradio
            {
                speedBall.X = -speedBall.X;
            }
            if (ballRec.Intersects(p2Rec))//caso haja interseção de pixels entre o player e a bola, sua velocidade é igualada ao seu oposto, para ela voltar em sentido contradio
            {
                speedBall.X = -speedBall.X;
            }
            #endregion

        }

        public void Draw(SpriteBatch spriteBatch)
        {
            spriteBatch.Draw(player1, posP1, Color.White);//desenha o player1
            spriteBatch.Draw(player2, posP2, Color.White);//desenha o player2
            spriteBatch.Draw(ball, ballpos, Color.White);//desenha a bola
            spriteBatch.DrawString(customFont, "Placar", new Vector2(350, 0), Color.White);//desenha o placar
            spriteBatch.DrawString(ptDir, _ptDir.ToString(), new Vector2(370, 20), Color.White);//desenha a pontuaçao do player 2
            spriteBatch.DrawString(ptEsq, _ptEsq.ToString(), new Vector2(400, 20), Color.White);//desenha a pontuaçao do player 1
        }
    }
}
